<?php
    function rotativo_admin($accion = null, $id = null)
    {
        switch($accion)
        {
            case 'admin'  : return drupal_get_form('pendientes_form_ver_informes',
                                                   $id);
            case 'agregar': return drupal_get_form('pendientes_form_agregar_informe',
                                                   'agregar');
            case 'editar' : return drupal_get_form('pendientes_form_agregar_informe',
                                                   'editar' , $id);
        }
    }
    
    function pendientes_form_ver_informes($form_id, $menu = '')
    {
        /* cabecera de la tabla */
        $cabecera = array
        (
            theme('table_select_header_cell'),
            array('data' => "Autor",               'field' => 'u.name'),
            array('data' => "Mensaje",             'field' => 'i.mensaje'),
            array('data' => "Creado hace",         'field' => 'i.creado'),
            array('data' => "Última modificación", 'field' => 'i.ultima_modificacion',
                                                   'sort'  => 'desc'),
            ""
        );
        
        if($menu == 'user')
        {
            global $user;

            /* información de todos los informes */
            $sql = "SELECT i.*, u.name AS autor FROM {informes} i, {users} u ".
                   "WHERE u.uid = i.autor AND i.autor = ".$user->uid.
                   tablesort_sql($cabecera);
            $coq = "SELECT COUNT(*) FROM {informes} i, {users} u ".
                   "WHERE u.uid = i.autor AND i.autor = ".$user->uid;
        }
        else
        {
            /* información de todos los informes */
            $sql = "SELECT i.*, u.name AS autor FROM {informes} i, {users} u ".
                   "WHERE u.uid = i.autor".
                   tablesort_sql($cabecera);
            $coq = "SELECT COUNT(*) FROM {informes} i, {users} u WHERE u.uid = i.autor";
        }
        
        /* agrega la información a un arreglo */
        $nump = 10;
        $informes = array();
        $checkboxes = array();
        $r = pager_query($sql, $nump, 0, $coq);
        while($i = db_fetch_array($r))
        {
            $informes[$i['id_informe']] = $i;
            $checkboxes[$i['id_informe']] = '';
        }

        /* elementos del formulario */
        $form['informes']   = array('#type'  => 'value'     , '#value'   => $informes);
        $form['cabecera']   = array('#type'  => 'value'     , '#value'   => $cabecera);
        $form['checkboxes'] = array('#type'  => 'checkboxes', '#options' => $checkboxes);
        $form['menu']       = array('#type'  => 'value'     , '#value' => $menu);
        $form['paginador']  = array('#value' => theme('pager', NULL, $nump));
        
        $form['borrar'] = array('#type'  => 'submit',
                                '#value' => "Borrar los informes seleccionados");
        
        return $form;
    }
    
    function theme_pendientes_form_ver_informes($form)
    {
        $filas = array();
        
        if($form['menu']['#value'] == 'user')
        {
            foreach($form['informes']['#value'] as $iid => $ival)
            {
                $filas[] = array($ival['mensaje'],
                                 format_interval(time() - $ival['creado']),
                                 'hace '.
                                 format_interval(time() - $ival['ultima_modificacion']),
                                 l('Editar','informes/'.$iid.'/editar'));
            }

            $form['checkboxes']['#type'] = 'value';
            $form['borrar']['#type'] = 'value';
            array_shift($form['cabecera']['#value']);
            array_shift($form['cabecera']['#value']);
        }
        else
        {
            foreach($form['informes']['#value'] as $iid => $ival)
                $filas[] = array(drupal_render($form['checkboxes'][$iid]),
                                 $ival['autor'],
                                 $ival['mensaje'],
                                 format_interval(time() - $ival['creado']),
                                 'hace '.
                                 format_interval(time() - $ival['ultima_modificacion']),
                                 l('Editar','admin/pendientes/rotativo/'.$iid.'/editar'));
        }

        return theme('table', $form['cabecera']['#value'], $filas).
               drupal_render($form['paginador']).
               drupal_render($form);
    }
    
    function pendientes_form_ver_informes_validate($form_id, &$form)
    {
        /* filtra sólo los checkboxes marcados */
        $form['values']['checkboxes'] = array_filter($form['values']['checkboxes']);
        
        /* verifica que se haya marcado al menos un checkbox */
        if(!count($form['values']['checkboxes']))
            form_set_error('checkboxes', "No has seleccionado ningún informe.");
    }
    
    function pendientes_form_ver_informes_submit($form_id, &$form)
    {
        /* número de informes que se van a eliminar */
        $count = count($form['values']['checkboxes']);
        
        /* consulta SQL */
        $sql = "DELETE FROM {informes} WHERE id_informe IN (".
               implode(',', $form['values']['checkboxes']).")";

        /* ejecuta la consulta y muestra un mensaje */
        if(db_query($sql))
            drupal_set_message("$count informes eliminados correctamente.");
        else
            drupal_set_message("Ocurrió un error al intentar eliminar los $count ".
                               "informes. Por favor inténtelo nuevamente.", 'error');
    }
    
    function pendientes_form_agregar_informe($form_id, $accion = 'agregar', $fid = null)
    {
        /* arreglo con los valores por defecto */
        if($accion == 'editar')
        {
            $sql = "SELECT mensaje FROM {informes} WHERE id_informe = %d";
            $informe = db_fetch_array(db_query($sql, $fid));
        }
        else $informe = array();
        
        /* valores que se pasan en el formulario, no son visibles para el usuario */
        $form['accion'] = array('#type' => 'value', '#value' => $accion);
        $form['fid']    = array('#type' => 'value', '#value' => $fid);

        /* campo para el mensaje del informe */
        $form['mensaje'] = array('#default_value' => $informe['mensaje'],
                                 '#description'   => "Texto que se mostrará en el rotativo".
                                                     " (máximo 256 caracteres).",
                                 '#required'      => false,
                                 '#title'         => t("Informe"),
                                 '#type'          => 'textarea');
        /* botón de envío */
        $form['envio'] = array('#type'  => 'submit',
                               '#value' => ($accion == 'editar') ?
                                           "Actualizar información" :
                                           "Añadir nuevo informe");

        return $form;
    }
    
    function pendientes_form_agregar_informe_validate($form_id, &$form)
    {
        /* verifica que el informe no esté vacío */
        if($form['values']['mensaje'] == "")
            form_set_error('informe', "El campo informe no puede estar vacío.");
    }
    
    function pendientes_form_agregar_informe_submit($form_id, &$form)
    {
        /* raliza una inserción o una actualización */
        if($form['values']['accion'] == 'agregar')
        {
            global $user;

            $sql = "INSERT INTO {informes} VALUES (NULL, $user->uid, '".
                   $form['values']['mensaje']."', ".time().", ".time().")";

            $mensaje_conf  = "Informe agregado correctamente.";
            $mensaje_error = "No se agregó el informe, por favor inténtelo nuevamente.";
        }
        else
        {
            $sql = "UPDATE {informes} SET mensaje = '".$form['values']['mensaje'].
                   "', ultima_modificacion = ".time().
                   " WHERE id_informe = ".$form['values']['fid'];

            $mensaje_conf  = "Informe actualizado correctamente.";
            $mensaje_error = "No se actualizó la información correctamente, ".
                             "por favor inténtelo nuevamente.";
        }   
        /* realiza la consulta SQL */
        db_query($sql) ? drupal_set_message($mensaje_conf) : drupal_set_message($mensaje_error, 'error');
        
        /* página que se muestra después de llenar el formulario */
        if(user_access('administrar informes'))
            drupal_goto('admin/pendientes/rotativo');
        else
            drupal_goto('informes');
    }
?>
